#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <iostream>
#include "Lista.h"
#include <string.h>
#include "MeuElementoFofinho.h"
#include "Coordenada.h"
using namespace std;

void except(int);
void imprimeMenu();
void imprimirLista(Lista<MeuElementoFofinho>*);
char* lerString();
int lerInt();
void executar();

void teste();
int main(int argc, char** argv) {
	//executar();
	teste();
	return 0;
}
void teste(){
	Lista<Coordenada> nomes(5);

	nomes.Adiciona(*new Coordenada(lerString()));
	nomes.Adiciona(*new Coordenada(lerString()));
	nomes.Adiciona(*new Coordenada(lerString()));
	nomes.Adiciona(*new Coordenada(lerString()));
	nomes.Adiciona(*new Coordenada(lerString()));


	nomes.ObtemElemento(0).mostreSe();
	nomes.ObtemElemento(1).mostreSe();
	nomes.ObtemElemento(2).mostreSe();
	nomes.ObtemElemento(3).mostreSe();
	nomes.ObtemElemento(4).mostreSe();


	cout<<"fim"<<endl;


}

void executar() {

	Lista<MeuElementoFofinho> lP(100);
	int op = 10;

	while (op != 0) {
		imprimeMenu();
		scanf("%d", &op);
		switch (op) {
		case 1:
			try {
				MeuElementoFofinho *e = new MeuElementoFofinho(lerString());

				lP.Adiciona(*e);
			} catch (int exc) {
				except(exc);
			}
			break;
		case 2:
			try {
				MeuElementoFofinho *e = new MeuElementoFofinho(lerString());

				lP.AdicionaNoInicio(*e);
			} catch (int exc) {
				except(exc);
			}
			break;
		case 3:
			try {
				int posicao = lerInt();
				MeuElementoFofinho *e = new MeuElementoFofinho(lerString());
				lP.AdicionaNaPosicao(*e, posicao);
			} catch (int exc) {
				except(exc);
			}
			break;

		case 4:
			try {
				MeuElementoFofinho *e = new MeuElementoFofinho(lerString());
				lP.AdicionaEmOrdem(*e);
			} catch (int exc) {
				except(exc);
			}
			break;
		case 5:
			try {
				MeuElementoFofinho e = lP.Retira();

				printf("%s foi retirado da lista.\n\n", e.ObtemElemento());

			} catch (int exc) {
				except(exc);
			}
			break;
		case 6:
			try {
				MeuElementoFofinho e = lP.RetiraDoInicio();
				printf("%s foi retirado da lista.\n\n", e.ObtemElemento());

			} catch (int exc) {
				except(exc);
			}
			break;
		case 7:
			try {
				MeuElementoFofinho e = lP.RetiraDaPosicao(lerInt());
				printf("%s foi retirado da lista.\n\n", e.ObtemElemento());

			} catch (int exc) {
				except(exc);
			}
			break;
		case 8:
			try {

				MeuElementoFofinho e = lP.RetiraEspecifico(
						MeuElementoFofinho(lerString()));
				printf("%s foi retirado da lista.\n\n", e.ObtemElemento());

			} catch (int exc) {
				except(exc);
			}
			break;
		case 9:
			try {
				imprimirLista(&lP);
			} catch (int exc) {
				except(exc);
			}
			break;
		case 0:
			printf("Hasta La Vista Baby!\n");
			break;
		default:
			printf("Sinto muito, opção inválida.\n");
			break;
		}
	}

}

void imprimeMenu() {
	printf("Menu:\n\n");

	printf("1: Adicionar\n");
	printf("2: Adicionar no início\n");
	printf("3: Adicionar na posição\n");
	printf("4: Adicionar em ordem\n");
	printf("5: Retirar\n");
	printf("6: Retirar do início\n");
	printf("7: Retirar da posição\n");
	printf("8: Retirar específico\n");
	printf("9: Imprimir Lista\n");
	printf("0: Sair\n");
	printf("\n");
}

void except(int exc) {
	switch (exc) {
	case -1:
		printf("Lista vazia!\n");
		break;
	case -2:
		printf("A lista está cheia!\n");
		break;
	case -3:
		printf("Posição invalida!\n");
		break;
	case -4:
		printf("Elemento inexistente!\n");
		break;
	default:
		break;

	}
	printf("\n");
}

char* lerString() {
	char buffer[10000];
	char *point;
	setbuf(stdin, NULL);
	printf("Digite a String a ser armazenada\n");
	scanf("%[^\n]s", buffer); //Ler strings com espaços
	setbuf(stdin, NULL);

	int size = strlen(buffer);
	point = new char[size];
	strcpy(point, buffer);

	printf("\n");
	return point;
}

int lerInt() {
	int aux;
	printf("Digite a posição:\n");
	scanf("%i", &aux);
	printf("\n");
	return aux;
}

void imprimirLista(Lista<MeuElementoFofinho> *p) {
	printf("Imprimindo lista:\n\n");

	if (p->EstaVazia())
		printf("Lista vazia!\n");

	for (int i = 0; i < p->ObtemUltimo() + 1; i++) {
		printf("%d", i);
		printf("> %s", p->ObtemElemento(i).ObtemElemento());
		printf("\n");
	}
	printf("\n");
}

